Product : ISaGRAF NT Target 3.x

Date    : 24-Febuary-1997

File    : EasyIO.EasyIO access memory inputs via driver kmemnt.sys.htm

Subject : EasyIO access memory inputs via driver kmemnt.sys

Keywords: EasyIO - kmemnt - I/O - NT target

____________________________________________________________________

Question:

Scanning in a loop one boolean input via a pointer in the

memory mapped in my process, when the input changes, the value

read by the pointer doesn't change. Following is an example of the

loop:

char *booPtr = memory_address ;

while( *booPtr && !time_out )

time_out-- ;

Answer:

The problem comes from your compiler, which optimizes this kind

of loop by extracting what is called the loop constants. The

resulting loop will look like following:

char *booPtr = memory_address ;

while( !time_out )

time_out-- ;

Because, you don't do anything with the *booPtr variable, the

optimizer, keeps it away from the loop. In the ANSI C, there is a

keyword to tell the optimizer that the variable can be changed by

another process (or hardware, or operating system). The keyword is

'volatile'. The declaration of the pointer should be of the

following form:

volatile char *booPtr ; /* This means that the value pointed

to by the pointer is volatile */

In this case, the loop will be optimized, so that the value

*booPtr will be read at each loop.

____________________________________________________________________

Copyright © 1996-2009 ICS Triplex ISaGRAF Inc. All rights reserved.